﻿using System;

/// <summary>
///工厂方法模式的主要角色如下。 
///抽象工厂（Abstract Factory）：提供了创建产品的接口，调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
///具体工厂（ConcreteFactory）：主要是实现抽象工厂中的抽象方法，完成具体产品的创建。
///抽象产品（Product）：定义了产品的规范，描述了产品的主要特性和功能。
///具体产品（ConcreteProduct）：实现了抽象产品角色所定义的接口，由具体工厂来创建，它同具体工厂之间一一对应。
/// </summary>
namespace FactoryMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            AbstractFactory abstractFactory = new ConcreteFactory1();
            var Product =  abstractFactory.newProduct();
            Product.show();
        }
    }


    //抽象产品：提供了产品的接口
    interface Product
    {
        public void show();
    }
    //具体产品1：实现抽象产品中的抽象方法
    class ConcreteProduct1 : Product
    {
        public void show()
        {
            Console.WriteLine("具体产品1显示...");
        }
    }
    //具体产品2：实现抽象产品中的抽象方法
    class ConcreteProduct2 : Product
    {
        public void show()
        {
            Console.WriteLine("具体产品2显示...");
        }
    }
    //抽象工厂：提供了厂品的生成方法
    interface AbstractFactory
    {
        public Product newProduct();
    }
    //具体工厂1：实现了厂品的生成方法
    class ConcreteFactory1 : AbstractFactory
    {
        public Product newProduct()
        {
            Console.WriteLine("具体工厂1生成-->具体产品1...");
            return new ConcreteProduct1();
        }
    }
    //具体工厂2：实现了厂品的生成方法
    class ConcreteFactory2 : AbstractFactory
    {
        public Product newProduct()
        {
            Console.WriteLine("具体工厂2生成-->具体产品2...");
            return new ConcreteProduct2();
        }
    }
}
